package com.st.qdmall.controller;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView;

import com.st.qdmall.entity.User;
import com.st.qdmall.service.IUserService;

@Controller
public class UserController {
	

	@Autowired // 由Spring自动注入
	private IUserService userService;
	/**
	 * 用户注册, 页面
	 * GetMapping注解，表示当前方法只接收Get类型的请求
	 */
	@GetMapping("/register.do")
	public String register() {
		return "register";
	}
	
	@PostMapping("/register.do")
	public ModelAndView register(
			String username,
			String password,
			String password2,
			ModelAndView mv) {		
		// 调用Service层
		int res = userService.register(username, password, password2);
		
		if (res>0) {
			// 注册成功， 跳转到登录页面
			mv.setViewName("redirect:login.do"); // 让页面跳转到login.do
		} else if (res == -2) {
			// 两次密码不一致
			mv.addObject("error", "两次密码不一致");
			mv.setViewName("register");
		} else if (res == -3) {
			// 用户名不可用
			mv.addObject("error", "用户名不可用");
			mv.setViewName("register");
		}
		
		return mv;
	}
	
	/**
	 * 用户登录
	 */
	@GetMapping("/login.do")
	public String login() {
		return "login";
	}
	
	
	/**
	 * 处理登录的提交操作
	 * 1. 定义方法， 返回ModelAndView
	 * 2. 添加注解，
	 * 3. 接收参数
	 * 4. 调用Service进行逻辑的处理
	 * 5. 页面的跳转
	 */
	// 2
	@PostMapping("/login.do")
	// 1
	public ModelAndView login(
			// 接收参数
			String username,
			String password,
			
			// 注入Session对象
			HttpSession session,
			
			ModelAndView mv) {
		// 4. 
		User user = userService.login(username, password);
		
		// 5. 根据Service层的返回值，判断应该返回什么样的视图
		if (user != null) {
			// 登录成功
			// 用户登录成功之后，需要一个东西，能够长久地保存用户的登录信息
			// 会话Session
			// 将登录用户的信息，保存在Session中
			session.setAttribute("user", user);
			
			// 跳转到主页面
			mv.setViewName("redirect:index.do");
		} else {
			// 登录失败
			// 提示错误信息
			mv.addObject("error", "账号或密码错误");
			// 返回登录页面
			mv.setViewName("login");
		}
		
		return mv;
	}
	
	/**
	 * 用户退出
	 * Get请求
	 */
	@GetMapping("/logout.do")
	public String logout(HttpSession session) {
		// 清理用户的登录信息
		// removeAttribute("属性名")
		// session.removeAttribute("user");
		// in();
		session.invalidate(); // 让Session对象失效
		
		return "redirect:index.do";
	}
	
	/**
	 * 修改密码的页面
	 * 1. 定义一个方法，返回String
	 * 2. 返回视图的名字
	 * 3. 加上GetMapping注解
	 * 4. 创建html页面
	 */
	@GetMapping("/modify.do")
	public String modify() {
		return "modify";
	}
	/**
	 * 接收用户修改密码的请求
	 * 1. 定义一个方法， 返回ModelAndView
	 * 2. 加上注解
	 * 3. 注入参数
	 * 4. 调用Service进行处理
	 * 5. 根据service层的处理结果，跳转页面
	 */
	@PostMapping("/modify.do")
	public ModelAndView modify(
			String oldpassword,
			String newpassword,
			String conpassword,
			HttpSession session,
			ModelAndView mv) {
		
		// 取出当前登录用户的信息
		User user = (User) session.getAttribute("user");
		
		
		int res = userService.modify(
				user,
				oldpassword, 
				newpassword, 
				conpassword);
		
		if (res > 0) {
			// 修改成功
			// 清除原来的登录信息
			session.invalidate();
			// 重新登录， 跳转到登录页面
			mv.setViewName("redirect:login.do");
		} else if (res == -2) {
			// 旧密码不对
			// 提示错误信息
			mv.addObject("error", "旧密码不正确！");
			// 返回修改页面
			mv.setViewName("modify");
		} else if (res == -3) {
			// 两次密码不一致
			mv.addObject("error", "两次密码不一致！");
			// 返回修改页面
			mv.setViewName("modify");
		} else {
			// 未知错误
			mv.addObject("error", "未知错误！");
			// 返回修改页面
			mv.setViewName("modify");
		}
		
		return mv;
	}
	
}









